package CSnab::Engine::ModPerl2;

use strict;
use warnings;

use mirt::WebApp::Context;
use mirt::WebApp::Tools;
use mirt::WebApp::Engine::ModPerl2::Tools;
use mirt::WebApp::View::ToolsCTPP2;
use mirt::WebApp::Session::Tools;
 
use mirt::Core::FilterChain;

use mirt::WebApp::Filter::SendHeaders;
use mirt::WebApp::Filter::ParseRequest;
use mirt::WebApp::Filter::RoutesDispatcher;
use mirt::WebApp::Filter::RouteStaticParams;
use mirt::WebApp::Filter::ErrorHandle;
use mirt::WebApp::Filter::ControllerLoad;
use mirt::WebApp::Filter::ControllerExec;
use mirt::WebApp::Filter::Redirect;
use mirt::WebApp::Filter::ServerStatusOK;
use mirt::WebApp::Filter::ViewRender;

sub handler {
	my $r = shift;
	
	#configure context (push locator)
	my $context = new mirt::WebApp::Context();
	
	$context->merge(new mirt::WebApp::Tools($r));
	$context->merge(new mirt::WebApp::Engine::ModPerl2::Tools);
	$context->merge(new mirt::WebApp::View::ToolsCTPP2);
	$context->merge(new mirt::WebApp::Session::Tools);
	
	#filter chain request process
	my $app = new mirt::Core::FilterChain();

	$app->registerFilter(new mirt::WebApp::Filter::ErrorHandle);
	$app->registerFilter(new mirt::WebApp::Filter::ParseRequest);
	$app->registerFilter(new mirt::WebApp::Filter::RoutesDispatcher);
	$app->registerFilter(new mirt::WebApp::Filter::RouteStaticParams);
	$app->registerFilter(new mirt::WebApp::Filter::ControllerLoad);
	$app->registerFilter(new mirt::WebApp::Filter::ControllerExec);
	$app->registerFilter(new mirt::WebApp::Filter::SendHeaders);
	$app->registerFilter(new mirt::WebApp::Filter::Redirect);
	$app->registerFilter(new mirt::WebApp::Filter::ServerStatusOK);
	$app->registerFilter(new mirt::WebApp::Filter::ViewRender);
	
	$app->process($context);
	
	return $context->getResponse->code();
}

BEGIN {
	require mirt::Toolkit;
	require mirt::Config::Tools;
	require mirt::DB::Tools;
	require mirt::Log::Tools;
	require mirt::Cache::Tools;
	require mirt::DB::Cached;
	
	#create toolkit
	mirt::Toolkit->merge(new mirt::Config::Tools);
	mirt::Toolkit->merge(new mirt::DB::Tools);
	mirt::Toolkit->merge(new mirt::Log::Tools);
	mirt::Toolkit->merge(new mirt::Cache::Tools);
	mirt::Toolkit->merge(new mirt::DB::Cached);
}

1;
